package net.jumpengine.manager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.jumpengine.Manager;
import net.jumpengine.bean.Base;
import net.jumpengine.inter.IUpdateBase;
import net.jumpengine.util.UCollision;

/**
 * 素材管理类
 * <br /><br />
 * <b>作者:&nbsp;</b>张天文 <br />
 * <b>日期:&nbsp;</b>2020-02-19 12:54<br />
 * @date
 */
public class ImageManager {
	private Map<Enum<?>,List<Base>> map=new HashMap<Enum<?>, List<Base>>();
	private Map<Enum<?>,List<IUpdateBase>> changeMap=new HashMap<Enum<?>, List<IUpdateBase>>();
	private boolean change=true;
	
	/**
	 * 添加素材
	 * @param state 游戏状态
	 * @param base 素材
	 * @return 素材管理类,便于连写
	 */
	public ImageManager add(Enum<?> state,Base base) {
		List<Base> list=map.get(state);
		if(list==null) {
			list=new ArrayList<Base>();
			map.put(state, list);
		}
		list.add(base);
		addChange(state, base);
		Manager.getEventManager().addClick(state, base);
		change=true;
		return this;
	}
	
	/**
	 * 添加素材集合
	 * @param state 游戏状态
	 * @param bases 素材集合
	 * @return 素材管理类,便于连写
	 */
	public ImageManager add(Enum<?> state,List<Base> bases) {
		if(bases==null || bases.size()==0) {
			
		}
		List<Base> list=map.get(state);
		if(list==null) {
			map.put(state, bases);
		}else {
			list.addAll(bases);
		}
		addChange(state, bases);
		for(Base base:bases) {
			Manager.getEventManager().addClick(state, base);
		}
		change=true;
		return this;
	}
	
	/**
	 * 给当前游戏状态的素材管理添加素材
	 * @param base 素材
	 * @return 素材管理类,便于连写
	 */
	public ImageManager add(Base base) {
		return add(Manager.getState(),base);
	}
	
	/**
	 * 给当前游戏状态的素材管理添加素材集合
	 * @param bases 素材集合
	 * @return 素材管理类,便于连写
	 */
	public ImageManager add(List<Base> bases) {
		return add(Manager.getState(),bases);
	}
	
	private void addChange(Enum<?> state,Base base) {
		if(base instanceof IUpdateBase) {
			List<IUpdateBase> list = changeMap.get(state);
			if(list==null) {
				list=new ArrayList<>();
				changeMap.put(state, list);
			}
			list.add((IUpdateBase) base);
		}
	}
	private void addChange(Enum<?> state,List<Base> bases) {
		List<IUpdateBase> list = changeMap.get(state);
		if(list==null) {
			list=new ArrayList<>();
			changeMap.put(state, list);
		}
		for(Base base:bases) {
			if(base instanceof IUpdateBase)list.add((IUpdateBase) base);
		}
	}
	
	/**
	 * 获取当前状态的素材集合,并排序过
	 * @return 排序过的素材集合
	 */
	public List<Base> currentSortList(){
		List<Base> list = map.get(Manager.getState());
		if(list!=null && change) {
			Collections.sort(list);
			change=false;
		}
		return list;
	}
	
	public List<IUpdateBase> currentChangeList(){
		return changeMap.get(Manager.getState());
	}
	
	/**
	 * 根据坐标获取是 T或者T子类的Base
	 * @param x x坐标
	 * @param y y坐标
	 * @param c 获取其与其子类
	 * @return 是 T或者T子类的Base,在x,y上,最小范围的Base
	 */
	@SuppressWarnings("unchecked")
	public <T extends Base> T FindBaseByPoint(int x,int y,Class<T> c) {
		List<Base> list = map.get(Manager.getState());
		if(list==null)return null;
		if(change) {
			Collections.sort(list);
			change=false;
		}
		Base base;
		boolean res;
		for(int i=list.size()-1;i>=0;i--) {
			base=list.get(i);
			res=UCollision.inBox(x, y, base);
			if(c.isAssignableFrom(base.getClass()) && res)return (T)base;
		}
		
		return null;
	}
	
	/**
	 * 清除某一游戏状态的图片素材
	 * @param state 游戏状态
	 * @return true-删除成功,false-没有此状态的素材集合
	 */
	public boolean clear(Enum<?> state) {
		boolean res=map.containsKey(state);
		map.remove(state);
		return res;
	}
}
